<?php

/*
 *	取得模块/操作所对应的文件
 *	@param	string	$mod_key
 *	@param	string	$act_key
 *	@return	string
 */
function getActionFile($mod_key, $act_key) {
	global $action_map;
	
	$module = $_GET[$mod_key]? strtolower(htmlentities($_GET[$mod_key],ENT_QUOTES)): 'default';
	$action = $_GET[$act_key]? strtolower(htmlentities($_GET[$act_key],ENT_QUOTES)): 'default';

	define('MODULE', $module);
	define('ACTION', $action);

	if(!is_array($action_map) || !array_key_exists($module, $action_map)) {
		dump_msg('module_not_found', '无法找到模块 "'. $module .'"');
	}
	if(!is_array($action_map[$module]) || !array_key_exists($action, $action_map[$module])) {
		dump_msg('action_not_found', '无法找到操作 "'. $action .'"');
	}

	$file_path = $action_map[$module][$action];
	if(file_exists($file_path)) {
		return $file_path;
	} else {
		dump_msg('file_not_found', '无法找到文件 "'. $file_path .'"');
	}
}


/*
 *	取得指定 SESSION 的值
 *	@param	string	$key	可以为一维或多维，一维直接使用变
 *							量名"var_name"，多维使用方括号"['var1'][var2]"
 *	@return	mixed
 */
function get_session($key) {
	$key_string = get_session_key($key);
	$cmd = '$session = &$_SESSION['. SESSION_ID .']'. $key_string .';';
	eval($cmd);
	return $session;
}


/*
 *	取得指定 SESSION 的值
 *	@param	string	$key	函数同"get_session"
 */
function set_session($key, $value='') {
	$key_string = get_session_key($key);
	$cmd = '$session = &$_SESSION['. SESSION_ID .']'. $key_string .';';
	eval($cmd);
	$session = $value;
}


/*
 *	转换 SESSION Key 值字符串
 *	@param	string	$key
 *	@return	string
 */
function get_session_key($key) {
	if(!strstr($key, ']')) {
		$key_string = "['". trim($key) ."']";
	} else {
		$key_string = $key;
	}
	return $key_string;
}


##################################################
#

/*
 *	模板加载函数
 */
function load_tpl($filename, $path='') {
	$template = '';

	if(!defined(TEMPLATE_PATH)) $template = TEMPLATE_PATH;

	$path = $template . $path . $filename .'.tpl';
	if(file_exists($path)) {
		return $path;
	} else {
		dump_msg('template_not_found', '无法找到模板文件 "'. $path .'"');
	}
}


/*
 *  显示数组、对象后中止运行
 *  @param  array   $data   要显示的数组、对象
 */
function dump($data) {
    echo "<pre>\n";
    print_r($data);
    echo "\n<pre>\n";
    exit;
}


/*
 *	以 JSON 格式输出数据
 */
function dump_json($data) {
	echo json_encode($data);
	exit;
}


/*
 *	输出错误信息
 */
function dump_msg($code, $message) {
	header("Content-type: text/html; charset=utf-8");
	echo <<<EOT
<h1>提示信息</h1>
<strong><code>$code</code></strong>
<p>$message</p>
EOT;
	exit;
}

//如果 $res 为假，则输出 $msg 后跳转至 $url
function error_jump($res, $msg='', $url='') {
	if(!$url) $url = ROOT_URL ."index.php";
	if(!$res) redirect($url, $msg);
	return true;
}

//如果 $res 为假，则输出 $msg JSON
function error_dump($res, $msg='') {
	if(!$res) dump_json(array('status' => 0, 'message' => $msg));
}

//如果 URL 中设置了 debug，则输出指定内容
function debug_dump($data) {
	if($_GET['debug']) dump($data);
}


/*
 *	检测是否有POST的数据
 */
function check_post() {
	return strtolower($_SERVER['REQUEST_METHOD']) == 'post';
}


/*
 *	将字符串进行安全处理 (get security string)
 */
function gss($string, $is_force=false) {
	$string = trim($string);
	if(!ini_get('magic_quotes_gpc') || $is_force) {
		$string = addslashes($string);
	}
	return $string;
}


############################################################
# 分页相关


/*
 *	取得当前页面地址(剔除翻页参数)
 */
function get_page_url() {
	$request_uri = get_current_url(false);
	$regex = "/&page=([0-9]+)/";
	if(preg_match($regex, $request_uri, $match_data)) {
		$uri = str_replace($match_data[0], '', $request_uri);
		return $uri;
	} else {
		$regex = "/\?page=([0-9]+)/";
		if(preg_match($regex, $request_uri, $match_data)) {
			$uri = str_replace($match_data[0], '', $request_uri);
			return $uri;
		} else {
			return $request_uri;
		}
	}
}


/*
 *	分页相关函数：取得各页的页号及其链接
 *	param	$count		数据的记录数
 *	param	$limit		每页显示的记录数
 *	param	$page		当前页码
 *	param	$url		指向的页面地址(不含page=X)
 *	param	$show_count	当页数过多时显示区间的长度
 */
/*
 *	分页相关函数：取得各页的页号及其链接
 *	param	$count		数据的记录数
 *	param	$limit		每页显示的记录数
 *	param	$page		当前页码
 *	param	$url		指向的页面地址(不含page=X)
 *	param	$show_count	当页数过多时显示区间的长度
 */
function get_pageinfo($count, $limit, $page, $url, $show_count=8) {
	$page_max = ceil($count / $limit);
	if($page_max < 2) return;

	list($url, $query_string) = explode('?', $url);

	//分析页面链接地址
	if($query_string) $query_string .= '&';
	$url .= "?". $query_string . "page=";
	$url_suffix = '';
	unset($query_string);

	$pageinfo = array();

	//第一页信息
	$pageinfo['first']['num']  = 1;
	$pageinfo['first']['link']	= ($page != 1)? $url .'1'. $url_suffix: '';

	//上一页信息
	if(($page - 1) > 0) {
		$pageinfo['previous']['num']  = $page - 1;
		$pageinfo['previous']['link'] = $url .($page - 1). $url_suffix;
	}

	//下一页信息
	if(($page + 1) <= $page_max) {
		$pageinfo['next']['num']  = $page + 1;
		$pageinfo['next']['link'] = $url .($page + 1). $url_suffix;
	}

	//最后一页信息
	$pageinfo['last']['num'] = $page_max;
	if($page != $page_max) {
		$pageinfo['last']['link'] = $url .$page_max. $url_suffix;
	}

	//计算要显示的首页/末页页数
	if($page_max < $show_count + 2) {	//总页数小于要显示的页数
		$count_start = 2;
		$count_end = $page_max - 1;
	} else {							//总页数大于要显示的页数
		$j = floor($show_count/2);

		if($page - $j <= 1) {
			$count_start = 2;
			$count_end = $count_start + $show_count - 1;
			if($count_end >= $page_max) $count_end = $page_max - 1;
		} elseif($page - $j > 1) {
			if($page + $j < $page_max - 1) {
				$count_start = $page - $j;
				$count_end = $count_start + $show_count - 1;
			} else {
				$count_end = $page_max - 1;
				$count_start = $count_end - $show_count + 1;
			}
		}

		//判断是否有前/后省略
		if($count_start > 2) {
			$pageinfo['more_prev'] = true;
		}
		if($count_end < ($page_max - 1)) {
			$pageinfo['next_next'] = true;
		}
	}

	$pagelist = array();
	for($i=$count_start; $i<=$count_end; $i++) {
		$arr = array();
		$arr['num']  = $i;
		$arr['link'] = ($i != $page)? $url . $i . $url_suffix: '';
		$pagelist[]  = $arr;
	}

	$pageinfo['list'] = $pagelist;

	return $pageinfo;
}


/*
 *	分页相关函数：根据页号及其链接数据生成HTML信息
 *	param	$count		数据的记录数
 *	param	$limit		每页显示的记录数
 *	param	$page		当前页码
 *	param	$url		指向的页面地址(不含page=X)
 *	param	$show_count	当页数过多时显示区间的长度
 */
function get_pagehtml($count, $limit, $page, $url, $show_count=8) {
	$pageinfo = get_pageinfo($count, $limit, $page, $url, $show_count);
	if(!$pageinfo) return;

	$html = '';

	if($pageinfo['previous']['link']) {
		$html .= '<span class="text"><a href="'. $pageinfo['previous']['link'] .'">上一页</a></span>';
	} else {
		$html .= '<span class="text">上一页</span>';
	}
	$html .= "&nbsp;";
	if($pageinfo['first']['link']) {
		$html .= '<span><a href="'. $pageinfo['first']['link'] .'">1</a></span>';
	} else {
		$html .= '<span>1</span>';
	}
	$html .= "&nbsp;";

	if($pageinfo['more_prev']) {
		$html .= '...';
		$html .= "&nbsp;";
	}

	foreach($pageinfo['list'] as $list) {
		if($list['link']) {
			$html .= '<span><a href="'. $list['link'] .'">'. $list['num'] .'</a></span>';
		} else {
			$html .= '<span>'. $list['num'] .'</span>';
		}
		$html .= "&nbsp;";
	}

	if($pageinfo['next_next']) {
		$html .= '...';
		$html .= "&nbsp;";
	}

	if($pageinfo['last']['link']) {
		$html .= '<span><a href="'. $pageinfo['last']['link'] .'">'. $pageinfo['last']['num'] .'</a></span>';
	} else {
		$html .= '<span>'. $pageinfo['last']['num'] .'</span>';
	}
	$html .= "&nbsp;";
	if($pageinfo['next']['link']) {
		$html .= '<span class="text"><a href="'. $pageinfo['next']['link'] .'">下一页</a></span>';
	} else {
		$html .= '<span class="text">下一页</span>';
	}

	return $html;
}


/*
 *  转向函数
 */
function redirect($url, $msg='') {
    if($msg) {
		echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'."\n";
		echo "<html>\n<body>\n";
        echo '<script>'."\n".'if(alert("'.$msg.'")) {'."\n".'window.location.href="'.$url.'";'."\n".'} else {'."\n".'window.location.href="'.$url.'";'."\n".'}'."\n".'</script>'."\n";
        echo "\n</body>\n</html>";
		exit;
    } else {
		//header("Location:". $url);
		exit('<meta http-equiv="refresh" content="0; URL='. $url .'">');
    }
}


/*
 *  取出指定二维数组中指定 key 的数据集
 *  @param  $array      数组数据
 *  @param  $keyid      要取得的 key
 *  @param  $mode       取出的模式: 'string': 字符串  'array': 数组  'sum': 同 key 元素之和
 */
function get_array(&$array, $keyid, $mode='array') {
    if(!is_array($array)) return false;
    $arr_tmp = array();
    foreach($array as $key => $val) {
        if(!in_array($val[$keyid], $arr_tmp)) {
            $arr_tmp[] = $val[$keyid];
        }
    }
	return ($mode == 'array')? $arr_tmp: implode(',', $arr_tmp);
}


/*
 *  根据指定的数组和关键字生成一维数组
 */
function create_array($array, $key_val, $key_name) {
    if(is_array($array)) {
        $result = array();
        foreach($array as $val) {
            $result[$val[$key_val]] = $val[$key_name];
        }
        return $result;
    }
    return false;
}

/*
 *  对二维数组进行排序
 *  @param  $array
 *  @param  $keyid  排序的键值
 *  @param  $order  排序方式 'asc':升序 'desc':降序
 *  @param  $type   键值类型 'number':数字 'string':字符串
 */
function sort_array(&$array, $keyid, $order='asc', $type='number') {
    if(is_array($array)) {
        foreach($array as $val) {
            $order_arr[] = $val[$keyid];
        }
        $order = ($order == 'asc')? SORT_ASC: SORT_DESC;
        $type  = ($type == 'number')? SORT_NUMERIC: SORT_STRING;
        array_multisort($order_arr, $order, $type,$array);
    }
}


/*
 *  根据指定的数组和关键字生成下拉菜单项
 */
function create_select($array, $key_val='', $key_name='', $default_val='') {
	if(is_array($array)) {
		$str_select = '';
		if($key_val || $key_name) {
			foreach($array as $val) {
				$select = (trim($val[$key_val]) == $default_val)? ' selected': '';
				$str_select .= '<option value="'. trim($val[$key_val]) .'"'.$select.'>'. trim($val[$key_name]) ."</option>";
			}
		} else {
			foreach($array as $val) {
				$select = (trim($val) == $default_val)? ' selected': '';
				$str_select .= '<option value="'. trim($val) .'"'.$select.'>'. trim($val) ."</option>";
			}
		}
		return $str_select;
	}
	return false;
}


/*
 *  取得当前IP
 */
function get_ip($type='ip') {
	$ip = $_SERVER['REMOTE_ADDR'];
	if($type == 'long') $ip = ip2long($ip);
    return $ip;
}


/*
 *  文件写入函数
 */
function write_file($data, $filename, $type='a') {
    $fp = @fopen($filename, $type);
	if(!$fp) return false;
    @flock($fp, LOCK_EX) ;
    $result = @fwrite($fp, $data);
    @flock($fp, LOCK_UN);
    @fclose($fp);
	return $result !== FALSE;
}

//取得当前页面地址
function get_current_url($is_encode=1) {
	if($_SERVER['REQUEST_URI'] && strpos($_SERVER['REQUEST_URI'], '?')) {
		$url = $_SERVER['REQUEST_URI'];
	} else {
		$url = $_SERVER['PHP_SELF'];
		if($_SERVER['argv'][0]) {
			$url .= '?'. $_SERVER['argv'][0];
		}
	}
	if($is_encode) $url = urlencode($url);
	return $url;
}

//取得返回地址
function get_return_url($def_url='') {
	if($_GET['return']) return $_GET['return'];
	return $def_url;
}

//递归删除指定的目录
function remove_dir($dir_name) {
	if(!is_dir($dir_name)) {return false;}

	$handle = opendir($dir_name);
	while(($file = readdir($handle)) !== false) {
		if($file != '.' && $file != '..') {
			$dir = $dir_name . DIRECTORY_SEPARATOR . $file;
			is_dir($dir) ? remove_dir($dir) : unlink($dir);
		}
	}
	closedir($handle);

	$result = @rmdir($dir_name)? true: false;
	return $result;
}

//检测是否用域名访问
function check_domain_visit() {
	if(preg_match("/^([0-9.]+)$/", $_SERVER['SERVER_NAME'])) return false;
	return true;
}

//获取当前访问者使用的域名
function get_visit_domain() {
	$arr_tmp = explode('.', $_SERVER['SERVER_NAME']);
	unset($arr_tmp[0]);
	$domain = implode('.', $arr_tmp);
	return $domain;
}

//抓取网页内容
function get_url_data($url, $timeout=1) {
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
	$data = curl_exec($ch);
	curl_close($ch);
	return $data;
}

/*
 *	根据指定的中文字符串显示其在当前语言中所对应的字符(echo language)
 *	修改languages.ini文件可以调整修改前台文字
 *	@param		$string		中文字符串
 *	@output		string
 *	@return		null
 */
function el($string, $mode='echo') {
	global $langdata;
	$is_find = false;
	$lang = strtolower(get_session('language'));

	//从原始language.inc.php中找到key
	if(is_array($langdata['zh'])) {
		foreach($langdata['zh'] as $key => $item) {
			if($item == $string) {
				$is_find = true;
				break;
			}
		}
	}
	
	//把languages.ini的语言数据写到临时PHP文件
	if(!file_exists(ROOT.'admin/include/language_tmp.inc')){
		$lang_str = file_get_contents(ROOT.'admin/include/language.inc');
		$lang_str = str_replace("langdata","language",$lang_str);
		file_put_contents(ROOT.'admin/include/language_tmp.inc',$lang_str);
	}

	//输出通过key找到临时PHP文件的值
	include ROOT.'admin/include/language_tmp.inc';
	if($is_find && $language[$lang][$key]) {
		$string = $language[$lang][$key];
	}

	if($mode == 'echo') {
		echo $string;
	} else {
		return $string;
	}
}

//检测IP格式
function check_ip($ip) {
	if(!preg_match("/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/", $ip, $match_list)) return false;
	if(	$match_list[1] == 0  || $match_list[1] > 254 || $match_list[2] > 254 ||
		$match_list[3] > 254 || $match_list[4] > 254 || $match_list[4] == 0 ) {
		return false;
	}
	return true;
}

//检测域名格式
function check_domain($domain) {
	if(!preg_match("/^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?$/", $domain, $match_list)) return false;
	if(!preg_match("/^[a-zA-Z]{2,8}+$/", substr($match_list[1], 1))) return false;
	return true;
}